package com.gdust.lease.common.utils;

import com.gdust.lease.common.exception.LeaseException;
import com.gdust.lease.common.result.ResultCodeEnum;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;

import javax.crypto.SecretKey;
import java.util.Date;

/**
 * ClassName: JwtUtil
 * Package: com.gdust.lease.common.utils
 * Description:7.创建JWT，并响应给浏览器。
 *
 * @Author syun
 * @Create 2025/2/7 20:15
 * @Version 1.0
 */
public class JwtUtil {
    //需要32位密码，随机密码生成即可
    //作为成员变量。后续解析token方法也会使用
    /*
     使用固定的字符串生成一个HMAC SHA密钥。
     Keys.hmacShaKeyFor() 方法接受一个字节数组作为参数，生成一个SecretKey实例。
     这里的字符串 "wlryq30exjhkf8m6af0h7jpwmzyhrxrz" 是密钥的原始数据，使用 getBytes() 方法将其转换为字节数组。
    */
    private static SecretKey secretKey = Keys.hmacShaKeyFor("wlryq30exjhkf8m6af0h7jpwmzyhrxrz".getBytes());

    /**
     * 创建token
     * @param userId 用户id
     * @param userName 用户名称
     * @return
     */
    public static String createToken(Long userId, String userName) {
        String jwt = Jwts.builder().
                setExpiration(new Date(System.currentTimeMillis() + 360000 * 24 * 3650L)).
                setSubject("LOGIN_USER").
                claim("userId", userId).
                claim("username", userName).
                signWith(secretKey, SignatureAlgorithm.HS256)
                .compact();
        return jwt;
    }

    /**
     * @param token
     * @Description 校验token的合法性
     */
    public static Claims parseToken(String token) {
        if (token == null) {
            throw new LeaseException(ResultCodeEnum.ADMIN_LOGIN_AUTH);
        }

        try {
            JwtParser jwtParser = Jwts.parserBuilder().
                    setSigningKey(secretKey).
                    build();
            //Jws:带签名的Jwt
            Jws<Claims> claimsJws = jwtParser.parseClaimsJws(token);
            return claimsJws.getBody();
        } catch (ExpiredJwtException e) {
            throw new LeaseException(ResultCodeEnum.TOKEN_EXPIRED);
        } catch (JwtException e) {
            throw new LeaseException(ResultCodeEnum.TOKEN_INVALID);
        }
    }


    public static void main(String[] args) {
        //对应员工信息表的信息
        //admin项目生成token
//        System.out.println(createToken(2L, "user"));

        //app项目生成token
        System.out.println(createToken(8L,"13828682275"));

    }

}

